﻿using System;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ENProyecto7;
using System.IO;

namespace ProyectoSIETE
{
    public partial class frmGestionMisiones : Form
    {
        ENMision mision = new ENMision();
        ENMapa mapa = new ENMapa();

        private string directorioImagenes = @"..\..\..\WebProyectoSiete\img\";

        public frmGestionMisiones()
        {
            InitializeComponent();
        }

        private void frmGestionMisiones_Load(object sender, EventArgs e)
        {
            actualizarMisiones();

            DataTable dataMapa = new DataTable();
            dataMapa = mapa.obtenerMapas();
            cbMapa.DataSource = dataMapa;
            cbMapa.DisplayMember = "nombreMapa";
            cbMapa.ValueMember = "idMapa";


            cbMapa.SelectedIndex = -1;
            cbMapa.Text = "Selecciona un Mapa";
        }

        private void btMostrar_Click(object sender, EventArgs e)
        {
            if (lbListaMisiones.SelectedIndex >= 0)
            {
                try
                {
                    mision.IdMision = int.Parse(lbListaMisiones.SelectedValue.ToString());
                    mision.obtenerMision();

                    tbNombre.Text = mision.NombreMision;
                    int i = 0;
                    bool encontrado = false;
                    while (i < cbMapa.Items.Count && !encontrado)
                    {
                        cbMapa.SelectedIndex = i;
                        if (int.Parse(cbMapa.SelectedValue.ToString()) == mision.MapaMision)
                            encontrado = true;

                        i++;
                    }
                    
                    i = 0;
                    encontrado = false;
                    while (i < cbLocalizacion.Items.Count && !encontrado)
                    {
                        cbLocalizacion.SelectedIndex = i;
                        if (int.Parse(cbLocalizacion.SelectedValue.ToString()) == mision.InicioMision)
                            encontrado = true;

                        i++;
                    }
                    
                    tbDescripcion.Text = mision.DescripcionMision;
                    nudObjetivo.Value = mision.ObjetivoMision;
                    cbDificultad.SelectedIndex = mision.DificultadMision;

                    i = 0;
                    encontrado = false;
                    while (i < cbTaberna.Items.Count && !encontrado)
                    {
                        cbTaberna.SelectedIndex = i;
                        if (int.Parse(cbTaberna.SelectedValue.ToString()) == mision.TabernaMision)
                            encontrado = true;

                        i++;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
                }
            }
        }

        private void btLimpiar_Click(object sender, EventArgs e)
        {
            tbNombre.Text = "";
            cbMapa.SelectedIndex = -1;
            cbMapa.Text = "Selecciona un mapa";
            tbDescripcion.Text = "";
            cbLocalizacion.SelectedIndex = -1;
            cbLocalizacion.Text = "Selecciona un lugar";
            cbTaberna.SelectedIndex = -1;
            cbTaberna.Text = "Selecciona un lugar";
            nudObjetivo.Value = 0;
            cbDificultad.SelectedIndex = -1;
            cbDificultad.Text = "Selecciona un nivel";
            inicializarErrores();
        }

        private void cbLocalizacion_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void ckbTaberna_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void cbTaberna_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private void lbListaMisiones_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        private bool validar()
        {
            bool valido = true;
            Regex regNombre = new Regex(@"^[a-zA-Z0-9-_\s]*$");

            inicializarErrores();

            //Comprobamos que los datos insertados en el formulario son correctos
            if (tbNombre.Text == null || tbNombre.Text == "")
            {
                epMision.SetError(tbNombre, "Introduce un nombre");
                valido = false;
            }
            else if (!regNombre.IsMatch(tbNombre.Text))
            {
                epMision.SetError(tbNombre, "El nombre solo puede contener letras, numeros, - y _");
                valido = false;
            }
            if (cbMapa.SelectedIndex < 0)
            {
                epMision.SetError(cbMapa, "Selecciona un mapa");
                valido = false;
            }
            if (cbLocalizacion.SelectedIndex < 0)
            {
                epMision.SetError(cbLocalizacion, "Selecciona una localizacion");
                valido = false;
            }
            if (nudObjetivo.Value == 0)
            {
                epMision.SetError(nudObjetivo, "Los puntos objetivo deben ser mayor que 0");
                valido = false;
            }
            if (cbDificultad.SelectedIndex < 0)
            {
                epMision.SetError(cbDificultad, "Selecciona una dificultad");
                valido = false;
            }
            if (cbTaberna.SelectedIndex < 0)
            {
                epMision.SetError(cbTaberna, "Selecciona un lugar para la taberna");
                valido = false;
            }

            return valido;
        }

        private void btNuevo_Click(object sender, EventArgs e)
        {
            if (validar())
            {
                try
                {
                    mision = new ENMision();

                    mision.NombreMision = tbNombre.Text;
                    mision.MapaMision = int.Parse(cbMapa.SelectedValue.ToString());
                    mision.DescripcionMision = tbDescripcion.Text;
                    mision.InicioMision = int.Parse(cbLocalizacion.SelectedValue.ToString());
                    mision.ObjetivoMision = (int)nudObjetivo.Value;
                    mision.DificultadMision = cbDificultad.SelectedIndex;
                    mision.TabernaMision = int.Parse(cbTaberna.SelectedValue.ToString());

                    if (mision.insertarMision())
                    {
                        MessageBox.Show("La mision se ha creado con éxito");
                        // Actualizamos
                        actualizarMisiones();
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
                }
            }
        }

        private void cbMapa_SelectedIndexChanged(object sender, EventArgs e)
        {
            DataTable dataLoc = new DataTable();
            DataTable datatab = new DataTable();
            mapa = new ENMapa();

            if (cbMapa.SelectedIndex < 0)
            {
                cbLocalizacion.Enabled = false;
                cbTaberna.Enabled = false;
                cbLocalizacion.SelectedIndex = -1;
                cbLocalizacion.Text = "Selecciona un lugar";
                cbTaberna.SelectedIndex = -1;
                cbTaberna.Text = "Selecciona un lugar";
                pbImagen.ImageLocation = "";
            }
            else
            {
                cbLocalizacion.Enabled = true;
                cbTaberna.Enabled = true;

                mapa.IdMapa = int.Parse(cbMapa.SelectedValue.ToString());
                mapa.obtenerMapa();
                string imagenMapa = mapa.ImagenMapa;
                if (File.Exists(directorioImagenes + imagenMapa))
                    pbImagen.ImageLocation = directorioImagenes + imagenMapa;
                else
                    pbImagen.ImageLocation = directorioImagenes + "sin_imagen.png";
                dataLoc = mapa.obtenerLocalizacionesMapa();
                cbLocalizacion.DataSource = dataLoc;
                cbLocalizacion.DisplayMember = "nombreLocalizacion";
                cbLocalizacion.ValueMember = "idLocalizacion";

                datatab = mapa.obtenerLocalizacionesMapa();
                cbTaberna.DataSource = datatab;
                cbTaberna.DisplayMember = "nombreLocalizacion";
                cbTaberna.ValueMember = "idLocalizacion";
            }
        }

        private void btBorrar_Click(object sender, EventArgs e)
        {
            if (lbListaMisiones.SelectedIndex >= 0)
            {
                if (MessageBox.Show("¿Desea borrar la mision " + lbListaMisiones.SelectedValue + "?", "Confirmación", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    try
                    {
                        mision.IdMision = int.Parse(lbListaMisiones.SelectedValue.ToString());

                        if (mision.borrarMision())
                        {
                            MessageBox.Show("La mision se ha borrado con éxito");
                            // Actualizamos
                            actualizarMisiones();
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error al borrar " + ex.ToString(), "Error", MessageBoxButtons.OK);
                    }
                }
            }
        }

        private void inicializarErrores()
        {
            epMision.SetError(tbNombre, "");
            epMision.SetError(cbMapa, "");
            epMision.SetError(cbLocalizacion, "");
            epMision.SetError(nudObjetivo, "");
            epMision.SetError(cbDificultad, "");
            epMision.SetError(cbTaberna, "");
        }

        private void btEditar_Click(object sender, EventArgs e)
        {
            if (validar())
            {
                try
                {
                    mision.NombreMision = tbNombre.Text;
                    mision.MapaMision = int.Parse(cbMapa.SelectedValue.ToString());
                    mision.DescripcionMision = tbDescripcion.Text;
                    mision.InicioMision = int.Parse(cbLocalizacion.SelectedValue.ToString());
                    mision.ObjetivoMision = (int)nudObjetivo.Value;
                    mision.DificultadMision = cbDificultad.SelectedIndex;
                    mision.TabernaMision = int.Parse(cbTaberna.SelectedValue.ToString());

                    if (mision.editarMision())
                    {
                        MessageBox.Show("La mision se ha editado con éxito");
                        // Actualizamos
                        actualizarMisiones();
                    }
                    else
                    {
                        MessageBox.Show("Para editar primero selecciona una mision de la lista", "Error: No se puede editar", MessageBoxButtons.OK);
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK);
                }
            }
        }

        private void actualizarMisiones()
        {
            // Actualizamos
            DataSet data = new DataSet();
            data = mision.obtenerMisiones();
            lbListaMisiones.DataSource = data.Tables["mision"];
            lbListaMisiones.DisplayMember = "nombreMision";
            lbListaMisiones.ValueMember = "idMision";
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frmGestionMisiones_Enter(object sender, EventArgs e)
        {
            actualizarMisiones();

            DataTable dataMapa = new DataTable();
            dataMapa = mapa.obtenerMapas();
            cbMapa.DataSource = dataMapa;
            cbMapa.DisplayMember = "nombreMapa";
            cbMapa.ValueMember = "idMapa";


            cbMapa.SelectedIndex = -1;
            cbMapa.Text = "Selecciona un Mapa";
        }
    }
}
